# list
# list是一种有序的集合，可以随时添加和删除其中的元素，可变对象。
classmates = ['Michael', 'Bob', 'Tracy']
print(classmates)  # ['Michael', 'Bob', 'Tracy']
print(len(classmates))  # 3

print(classmates[0])  # Michael
# print(classmates[3])  # 越界异常
print(classmates[len(classmates) - 1])  # Tracy

print(classmates[-1])  # Tracy
print(classmates[-2])  # Bob

# 追加
classmates.append('Adam')
classmates.insert(1, 'Jack')  # 也可以把元素插入到指定的位置，比如索引号为1的位置
print(classmates)  # ['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']

# 删除
classmates.pop()
print(classmates)  # ['Michael', 'Jack', 'Bob', 'Tracy']
classmates.pop(1)
print(classmates)  # ['Michael', 'Bob', 'Tracy']

# 替换
classmates[1] = 'Sarah'
print(classmates)  # ['Michael', 'Sarah', 'Tracy']

# 元素类型可以不同
L = ['Apple', 123, True]
print(L)  # ['Apple', 123, True]

# list元素也可以是另一个list，二维数组
s = ['python', 'java', ['asp', 'php'], 'scheme']
print(s)  # ['python', 'java', ['asp', 'php'], 'scheme']
print(len(s))  # 4
print(s[2][1])  # php

# 空的list
L = []
print(len(L))  # 0

# tuple
# 另一种有序列表叫元组：tuple。tuple和list非常类似，但是tuple一旦初始化就不能修改
# 如果可能，能用tuple代替list就尽量用tuple
classmates = ('Michael', 'Bob', 'Tracy')
print(classmates)  # ('Michael', 'Bob', 'Tracy')
print(classmates[0])
# classmates[1] = "limei"  # 能赋值成另外的元素

# tuple的陷阱：当你定义一个tuple时，在定义的时候，tuple的元素就必须被确定下来
t = (1, 2)  # (1, 2)
print(t)
t = ()
print(t)  # ()
t = (1)
print(t)  # 1
# 定义的不是tuple，是1这个数！这是因为括号()既可以表示tuple，又可以表示数学公式中的小括号，这就产生了歧义，因此，Python规定，这种情况下，按小括号进行计算，计算结果自然是1
t = (1,)
print(t)  # (1,)

# '可变的'tuple
t = ('a', 'b', ['A', 'B'])
print(t)  # ('a', 'b', ['A', 'B'])
t[2][0] = 'X'
print(t)  # ('a', 'b', ['X', 'B'])
# tuple的元素确实变了，但其实变的不是tuple的元素，而是list的元素。tuple一开始指向的list并没有改成别的list，
# 所以，tuple所谓的“不变”是说，tuple的每个元素，指向永远不变。即指向'a'，就不能改成指向'b'，指向一个list，就不能改成指向其他对象，但指向的这个list本身是可变的！
